//长度最小的子数组  力扣209
//滑动窗口
//写法一（常规写法）
class Solution {
public:
	int minSubArrayLen(int target, vector<int>& nums) {
		int left = 0;
		int right = 0;
		int n = nums.size(); 
		int sum = 0;
		int ans = INT_MAX;
		for(  ; right < n; right++)
		{
			sum += nums[right];
			while(left <= right && sum >= target)
			{
				ans = min(ans,right - left + 1);
				sum -= nums[left];
				left++;
			}
		}
		return ans==INT_MAX ? 0 : ans;
	}
};
//写法二（非常规写法）
class Solution {
public:
	int minSubArrayLen(int target, vector<int>& nums) {
		int left = 0;
		int right = -1;//或=0
		int n = nums.size(); //这里很重要，nums.size()是无符号整形(size_t),与整形负数比较时
		//负数会先转变成无符号整形的正数，会产生难以预料的结果，
		//因此先将其转换为整形
		int sum = 0;
		int ans = INT_MAX;
		for(  ; left < n; left++)
		{
			while(right <= n-2/*或right <= n-1*/ && sum < target)
			{
				right++;
				sum += nums[right];
			  //sum += nums[right];
			  //right++;
			}                             //right - left
			if(sum >= target) ans = min(ans,right - left + 1);
			else break;
			sum -= nums[left];
		}
		return ans==INT_MAX ? 0 : ans;
	}
};
